package cl.foursoft.sirvicod.dao.implementacion.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cl.foursoft.sirvicod.dao.implementacion.DBBase;
import cl.foursoft.sirvicod.dao.interfaces.IDepartamento;
import cl.foursoft.sirvicod.dao.transferObject.DepartamentoTO;
import cl.foursoft.sirvicod.dao.transferObject.EstadoDeptoTO;
import cl.foursoft.sirvicod.util.UtilLog;

public class DepartamentoDB extends DBBase implements IDepartamento {

	public DepartamentoDB(Connection connection){
		this.conn = connection;
	}

	@Override
	public DepartamentoTO obtenerDepartamento(int numeroDepto) {
		DepartamentoTO resp = null;		
		PreparedStatement pstmt = null;		
		ResultSet rs = null;

		String query = 	" SELECT d.numero_depto, d.piso, ed.id_estado, ed.descripcion " +
						" FROM departamento d " +
						" INNER JOIN estado_depto ed ON ed.id_estado = d.id_estado " +
						" WHERE d.numero_depto = ? ";
		
		try
		{
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, numeroDepto);
			
			rs = pstmt.executeQuery();
			
			if(rs.next())
			{
				resp = new DepartamentoTO();
				
				resp.setNumeroDepto(rs.getInt("numero_depto"));
				resp.setPiso(rs.getInt("piso"));
				
				EstadoDeptoTO estado = new EstadoDeptoTO();
				estado.setIdEstado(rs.getString("id_estado"));
				estado.setDescripcion(rs.getString("descripcion"));
				
				resp.setEstado(estado);
			}
			rs.close();
			pstmt.close();
		}

		catch (SQLException sqle){
			UtilLog.registrar(sqle);
		}
		catch (Exception ex) {
			UtilLog.registrar(ex);
		}
		
		finally{
			if (pstmt != null) {
				try{
					pstmt.close();					
				} 
				catch (SQLException e) {
					UtilLog.registrar(e); 
					e.printStackTrace();
				}
			}
		}	
				
		return resp;
	}
	
	@Override
	public boolean existeDepartamento(int numeroDepto) {
		boolean resp = true;		
		PreparedStatement pstmt = null;		
		ResultSet rs = null;

		String query = 	" SELECT COUNT(numero_depto) departamentos " +
						" FROM departamento " +
						" WHERE numero_depto = ? ";
		
		try
		{
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, numeroDepto);
			
			rs = pstmt.executeQuery();
			
			if(rs.next())
			{
				resp = rs.getInt("departamentos") > 0;
			}
			rs.close();
			pstmt.close();
		}

		catch (SQLException sqle){
			UtilLog.registrar(sqle);
		}
		catch (Exception ex) {
			UtilLog.registrar(ex);
		}
		
		finally{
			if (pstmt != null) {
				try{
					pstmt.close();					
				} 
				catch (SQLException e) {
					UtilLog.registrar(e); 
					e.printStackTrace();
				}
			}
		}	
				
		return resp;
	}

	@Override
	public int guardarDepartamento(DepartamentoTO depto) {
		int resp = -1;		
		PreparedStatement pstmt = null;		

		String query = 	" INSERT INTO departamento (numero_depto, piso, rut_propietario, id_estado) " +
						" VALUES (?, ?, ?, ?)";
		
		try
		{
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, depto.getNumeroDepto());
			pstmt.setInt(2, depto.getPiso());
			pstmt.setString(3, depto.getPropietario().getRut());
			pstmt.setString(4, depto.getEstado().getIdEstado());
			
			resp = pstmt.executeUpdate();

			pstmt.close();
		}

		catch (SQLException sqle){
			UtilLog.registrar(sqle);
		}
		catch (Exception ex) {
			UtilLog.registrar(ex);
		}
		
		finally{
			if (pstmt != null) {
				try{
					pstmt.close();					
				} 
				catch (SQLException e) {
					UtilLog.registrar(e); 
					e.printStackTrace();
				}
			}
		}	
				
		return resp;
	}

	@Override
	public int actualizarDepartamento(DepartamentoTO depto) {
		int resp = -1;		
		PreparedStatement pstmt = null;		

		String query = 	" UPDATE departamento " +
						" SET piso = ?, rut_propietario = ?, id_estado = ? " +
						" WHERE numero_depto = ?";
		
		try
		{
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, depto.getPiso());
			pstmt.setString(2, depto.getPropietario().getRut());
			pstmt.setString(3, depto.getEstado().getIdEstado());
			pstmt.setInt(4, depto.getNumeroDepto());
			
			resp = pstmt.executeUpdate();

			pstmt.close();
		}

		catch (SQLException sqle){
			UtilLog.registrar(sqle);
		}
		catch (Exception ex) {
			UtilLog.registrar(ex);
		}
		
		finally{
			if (pstmt != null) {
				try{
					pstmt.close();					
				} 
				catch (SQLException e) {
					UtilLog.registrar(e); 
					e.printStackTrace();
				}
			}
		}	
				
		return resp;
	}

}
